'''闭包的示例，计数器的功能'''
#不使用闭包
total = 0
def f1(step):
    global total
    total += step

print(f1.__globals__["total"])#初始的状态，0
f1(1)
#__globals__是函数的一个属性，函数所属的模块(当前这个.py文件)的全局变量字典
print(f1.__globals__["total"])#计数变成1
f1(2)
print(f1.__globals__["total"])#计数变成了3
#以上可以实现计数功能，但是不安全，一个函数的状态不属于函数本身，而是与这个模块所
#在的环境共享的，不同的线程都可以访问这个模块，这所有的线程的状态是共享的。


'''闭包的形式，计数的问题'''

def outer(total):
    def inner(step):
        nonlocal total#告诉解释器，此处的total变量要往上一层查找，也就外部函数的局部变量
        total += step
        return total
    return inner

f = outer(0) #调用外部函数，返回一个函数，这个函数就是一个闭包，0表示从开始计数

#__closure__是闭包的一个属性，里面存储了 闭包函数使用到的外部函数的局部变量
print(f.__closure__)
#cell_contents 闭包中的单元格内容，也就是内嵌函数引用到外部函数的局部变量的值
print(f.__closure__[0].cell_contents)

f(1)
print(f.__closure__[0].cell_contents)#计数变成了1，
f(1)
print(f.__closure__[0].cell_contents)#计数变成了2
f(3)
print(f.__closure__[0].cell_contents)#计数变成了5


print("~~~~~~以下相当于另一个线程~~~~~~·")
f1 = outer(100)
print(f1.__closure__[0].cell_contents)#100
f1(10)#在100的基础之上开始计数，变成了110
print(f1.__closure__[0].cell_contents)#110
f1(20)#在110的基础之上开始计数，变成了130
print(f1.__closure__[0].cell_contents)#130




